package com.taotao.job.rpc.server.invoker;

import com.taotao.job.rpc.core.invoker.Invoker;
import com.taotao.job.rpc.core.invoker.InvokerMeta;
import com.taotao.job.rpc.core.invoker.RpcInvokerException;
import com.taotao.job.rpc.core.utils.ReflectUtil;
import com.taotao.job.rpc.server.hold.ProviderHolder;

import java.lang.reflect.Method;

/**
 * @author fanbeibei
 * @date 2020/10/31 15:01
 */
public class LocalInvoker implements Invoker {

    private ProviderHolder providerHolder;

    public LocalInvoker(ProviderHolder providerHolder) {
        this.providerHolder = providerHolder;
    }

    @Override
    public <T> T invokeMethod(InvokerMeta invokerMeta, Class<T> expectResultClass) throws RpcInvokerException {
        return invokeLocalMethod(invokerMeta);
    }

    private <T> T invokeLocalMethod(InvokerMeta invokerMeta) throws RpcInvokerException {
        //调本地方法
        //1.检查是否存在
        Object provider = providerHolder.getProvider(invokerMeta.extractIfaceMeta());
        if (null == provider) {
            throw new RpcInvokerException("can not found provider for IfaceMeta:" + invokerMeta.extractIfaceMeta());
        }

        Method method = providerHolder.getMethod(invokerMeta.extractIfaceMeta());

        //2.执行方法
        return (T) ReflectUtil.invokeIface(provider, method, invokerMeta.getArgs());
    }


}
